/* Es wird ein JPanel erzeugt  das
 * dann in das Dashboard eingebunden wird.
 *  
 * 
 * Datei: AuthentifizierungsGUI.java   Autor: Johannes Reinhard
 * Datum: 14.11.2011                   Version: 0.4 
 * 
 *
 */
package GUI;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import personenverwaltung.Benutzer;
import bestellungsverwaltung.Mahnungsverwaltung;

public class AuthentifizierungsGUI
{
  private JPanel hauptJPanel; 		/* Haupt JPanel */
  private Dimension bildschirm; 	/* Bildschirmgroesse */
  private Dashboard sichereDashboard; 	/* Objekt Dashboard */

  /* Swing Komponenten die informellen Zwecken und zur 
   * Navigation durch das JPanel dienen. */
  private JTextArea informationstext;
  private JLabel anmeldename;
  private JTextField textAnmeldename;
  private JLabel passwort;
  private JPasswordField textPasswort;
  private JButton anmelden;
  private JComboBox<String> sprachauswahl;
  private JLabel label;

  private final int textfelder_hoehe = 30;
  private final int b_hoehe;
  private final int b_breite;


  /**
   * Konstruktor der Klasse AuthentifizierungsGUI
   * 
   * @param bord
   */
  protected AuthentifizierungsGUI (Dashboard bord)
  {
    sichereDashboard = bord;
    bildschirm = sichereDashboard.gibBildschirmgroesse ();
    b_hoehe = bildschirm.height / 100;
    b_breite = bildschirm.width / 100;
    erzeugeAuthentifizierunsgGUI ();
  }


  /**
   * Erzeuge eine JPanel das dann eingebunden wird
   */
  private void erzeugeAuthentifizierunsgGUI ()
  {
    hauptJPanel = new JPanel ();
    informationstext = new JTextArea ();
    anmeldename = new JLabel ("Anmeldename:");
    textAnmeldename = new JTextField ("Benutzer ID");
    passwort = new JLabel ("Passwort");
    textPasswort = new JPasswordField ("123123");
    anmelden = new JButton ("Anmelden");
    sprachauswahl = new JComboBox<String> ();
    /* Noetig um Bild einzubinden. */
    URL ressourcen;
    ImageIcon bild;

    hauptJPanel.setLayout (null);

    int[] sichtbar = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
    sichereDashboard.neuSortieren (sichtbar);

    sprachauswahl.addItemListener (new ItemListener ()
    {
      public void itemStateChanged (ItemEvent e)
      {
        /* Erzeugt ein OBkjekt das zur Sprache gehoert. */
        if (sprachauswahl.getSelectedItem ().equals ("English"))
        {
          WechselSprache lokal = new WechselSprache ("englisch");
          Dashboard.sprache = lokal;
          spracheAendern ();
        }
        if (sprachauswahl.getSelectedItem ().equals ("German"))
        {
          WechselSprache lokal = new WechselSprache ("deutsch");
          Dashboard.sprache = lokal;
          spracheAendern ();
        }
        if (sprachauswahl.getSelectedItem ().equals ("French"))
        {
          WechselSprache lokal = new WechselSprache ("franzoesisch");
          Dashboard.sprache = lokal;
          spracheAendern ();
        }
      }
    });
    sprachauswahl.addItem ("German");
    sprachauswahl.addItem ("English");
    sprachauswahl.addItem ("French");
    sprachauswahl.setBounds (20 * b_breite, 50 * b_hoehe,
        30 * b_breite, textfelder_hoehe);
    hauptJPanel.add (sprachauswahl);

    /* Einbinden eines Bildes, dass bei dem Login angezeigt wird. */
    ressourcen = ImageIO.class.getResource ("/GUI/logo.jpg");
    bild = new ImageIcon (ressourcen);
    label = new JLabel ();
    label.setIcon (bild);
    label.setBounds (0, 0, 100 * b_breite, 10 * b_hoehe);
    hauptJPanel.add (label);

    /*
     * Es wird ein Informationstext anzeigt, damit der Nutzer weiss was
     * gerade passiert.
     */
    hauptJPanel.add (informationstext);
    informationstext.setFocusable (false);
    informationstext.setBounds (0, 10 * b_hoehe, 90 * b_breite,
        10 * b_hoehe);

    hauptJPanel.add (anmeldename);
    anmeldename.setBounds (10 * b_breite, 60 * b_hoehe, 30 * b_breite,
        textfelder_hoehe);

    hauptJPanel.add (textAnmeldename);
    textAnmeldename.setBounds (20 * b_breite, 60 * b_hoehe,
        30 * b_breite, textfelder_hoehe);

    hauptJPanel.add (passwort);
    passwort.setBounds (10 * b_breite, 70 * b_hoehe, 30 * b_breite,
        textfelder_hoehe);

    hauptJPanel.add (textPasswort);
    textPasswort.setBounds (20 * b_breite, 70 * b_hoehe, 30 * b_breite,
        textfelder_hoehe);

    hauptJPanel.add (anmelden);
    anmelden.setBounds (55 * b_breite, 60 * b_hoehe, 10 * b_breite,
        10 * b_hoehe);

    /* Alle ActionListener fuer die Buttons werden implementiert. */
    buttonInAktionBringen ();
    /*
     * Alle ActionListener fuer aktionen mit der Maus in den Textfeldern
     * werden implementiert.
     */
    mausInAktionBringen ();
  }


  /**
   * Gibt das hauptJPanel zurueck
   * 
   * @return JPanel
   */
  protected JPanel getHauptJPanel ()
  {
    hauptJPanel.repaint ();
    return hauptJPanel;
  }


  /**
   * Buttons werden mit Listener versehen und es wird festgelegt was
   * passiert wenn sie betaetigt werden.
   */
  private void buttonInAktionBringen ()
  {
    anmelden.addActionListener (new ActionListener ()
    {
      public void actionPerformed (ActionEvent e)
      {
        anmelden ();
      }
    });

    /*
     * Wenn der Nutzer den Enterbutton im Passwortfeld betaetigt, dann
     * meldet der nutzer sich an.
     */
    textPasswort.addKeyListener (new KeyListener ()
    {
      public void keyPressed (KeyEvent e)
      {
        int key = e.getKeyCode ();
        if (key == KeyEvent.VK_ENTER)
        {
          anmelden ();
        }
      }


      public void keyReleased (KeyEvent e)
      {
      }


      public void keyTyped (KeyEvent e)
      {
      }
    });
  }


  /**
   * Es wird der Anmeldevorgang organisert.
   */
  private void anmelden ()
  {
    Benutzer benutzer;
    int loginName;
    String passwort;

    try
    {
      /* Logindaten einlesen */
      loginName = Integer.parseInt (textAnmeldename.getText ());
      passwort = new String (textPasswort.getPassword ());

      /* Fehler bei Anmeldung */
      if (sichereDashboard.persVer
          .passwortPruefen (loginName, passwort) == null)
      {
        dialog ();
      }
      else
      {
        benutzer = sichereDashboard.persVer.gibBenutzer (loginName);
        nachErfolgreicherAnmeldung (benutzer);
        Dashboard.nutzerID = loginName;
      }
    }
    catch (Exception ex)
    {
      /* Fehler bei Anmeldung. Wenn ID kein int-Wert ist */
      dialog ();
    }
  }


  /**
   * Wenn man sich erfolgreich angemeldet hat, dann wird aufgrund der
   * Rechte die Oberflaeche generiert.
   * 
   * @param benutzer
   */
  private void nachErfolgreicherAnmeldung (Benutzer benutzer)
  {
    int[] sichtbar = new int[12];

    /* Standardeinstellungen 0 = sehen und 1 = nicht sehen */
    sichtbar[0] = 0; 			/* Profil */
    sichtbar[1] = 0; 			/* Suchen */
    sichtbar[2] = 1; 			/* PerosnenVerwalten */
    sichtbar[3] = 1; 			/* Medien Verwalten */
    sichtbar[4] = 1; 			/* Medium Ausleihen */
    sichtbar[5] = 1; 			/* Standort */
    sichtbar[6] = 1; 			/* Statistik */
    sichtbar[7] = 1; 			/* Bestellung */
    sichtbar[8] = 1; 			/* Finanzen */
    sichtbar[9] = 1; 			/* Inventar */
    sichtbar[10] = 0; 			/* Anschaffungsvorschlag */
    sichtbar[11] = 0; 			/* Logout */

    sprachauswahl.setVisible (false);
    anmeldename.setVisible (false);
    textAnmeldename.setVisible (false);
    passwort.setVisible (false);
    textPasswort.setVisible (false);
    anmelden.setVisible (false);
    label.setVisible (false);
    informationstext.setVisible (false);

    if (benutzer.gibRechte ().darfAusleihen ())
    {
      sichtbar[4] = 0; 			/* Medium Ausleihen */
    }
    if (benutzer.gibRechte ().darfBibVisVerwalten ())
    {
      sichtbar[5] = 0; 			/* BibVis */
    }
    if (benutzer.gibRechte ().darfStatistikAnsehen ())
    {
      sichtbar[6] = 0; 			/* Statistik ansehen */
    }
    if (benutzer.istAdministrator () || benutzer.istMitarbeiter ())
    {
      sichtbar[2] = 0; 			/* PerosnenVerwalten */
      sichtbar[3] = 0; 			/* Medien Verwalten */
      sichtbar[7] = 0; 			/* Bestellung */
      sichtbar[8] = 0; 			/* Finanzen */
      sichtbar[9] = 0; 			/* Inventar */
    }
    sichereDashboard.neuSortieren (sichtbar);
    
    /* Es wird ueberprueft ob der Benutzer eine Mahngebuehr bezahlen 
     * muss und wenn dies der Fall ist wird diese hochgesetzt.
     */
    try
    {
      Mahnungsverwaltung mv = new Mahnungsverwaltung ();
      mv.MahnungsNachBenutzer (benutzer.gibId ());
    }
    catch (Exception e)
    {
    }
  }


  /**
   * Hier wird ein Listener an ein Textfeld gehaengt. Wenn man jetzt in
   * das Feld klick wird der bestehende Inhalt durch einen anderen
   * ersetzt.
   */
  private void mausInAktionBringen ()
  {
    textAnmeldename.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        if (textAnmeldename.getText ().equals ("Benutzer ID"))
        {
          textAnmeldename.setText ("");
        }
        else if (textAnmeldename.getText ().equals ("user id"))
        {
          textAnmeldename.setText ("");
        }
        else if (textAnmeldename.getText ().equals (
            "ID de l utilisateur"))
        {
          textAnmeldename.setText ("");
        }
        else
        {
        }
      }


      public void mouseEntered (MouseEvent e)
      {
      }


      public void mouseExited (MouseEvent e)
      {
      }


      public void mousePressed (MouseEvent e)
      {
      }


      public void mouseReleased (MouseEvent e)
      {
      }
    });
    textPasswort.addMouseListener (new MouseListener ()
    {
      public void mouseClicked (MouseEvent e)
      {
        textPasswort.setText ("");
      }


      public void mouseEntered (MouseEvent e)
      {
      }


      public void mouseExited (MouseEvent e)
      {
      }


      public void mousePressed (MouseEvent e)
      {
      }


      public void mouseReleased (MouseEvent e)
      {
      }
    });
  }


  /**
   * Aendert die Sprache der einzelnen Elemente in die ausgewaehlte
   * Sprache um.
   */
  private void spracheAendern ()
  {
    informationstext.setText ("\n\n\n\t"
        + Dashboard.sprache.lokal.gibUebersetzung ("Info"));
    anmeldename.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("Anmeldename"));
    textAnmeldename.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("Benutzer ID"));
    passwort.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("Passwort"));
    anmelden.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("Anmelden"));

    sichereDashboard.buttonProfil.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonProfil"));

    sichereDashboard.buttonSuchmaske.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonSuchmaske"));

    sichereDashboard.buttonPersonVerwalten
        .setText (Dashboard.sprache.lokal
            .gibUebersetzung ("buttonPersonVerwalten"));

    sichereDashboard.buttonMediumVerwalten
        .setText (Dashboard.sprache.lokal
            .gibUebersetzung ("buttonMediumVerwalten"));

    sichereDashboard.buttonMediumAusleihen
        .setText (Dashboard.sprache.lokal
            .gibUebersetzung ("buttonMediumAusleihen"));

    sichereDashboard.buttonStandort.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonStandort"));

    sichereDashboard.buttonStatistik.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonStatistik"));

    sichereDashboard.buttonBestellung.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonBestellung"));

    sichereDashboard.buttonFinanzen.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonFinanzen"));

    sichereDashboard.buttonInventar.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonInventar"));

    sichereDashboard.buttonAnschaffung.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonAnschaffung"));

    sichereDashboard.buttonLogout.setText (Dashboard.sprache.lokal
        .gibUebersetzung ("buttonLogout"));
  }


  /**
   * Dieser Doalog macht den Nutzer klar, dass er einen Fehler bei der
   * Anmeldung gemacht hat.
   */
  private void dialog ()
  {
    JOptionPane.showConfirmDialog (null,
        Dashboard.sprache.lokal.gibUebersetzung ("Falsch"),
        Dashboard.sprache.lokal.gibUebersetzung ("fehler"),
        JOptionPane.CLOSED_OPTION);
  }
}
